package org.csu.onlineedubackend.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.csu.onlineedubackend.dto.*;
import org.csu.onlineedubackend.entity.Course;

import java.util.List;
import java.util.Map;

public interface CourseService extends IService<Course> {
    //教师创建课程
    Integer createFullCourse(CreateCourseDTO createCourseDTO);

    //教师查看自己已上架的课程
    List<Course> getCoursesByTeacherId(Integer teacherId);

    //教师查看评论
    List<CourseCommentDTO> getCommentsByCourseId(Integer courseId);

    //教师查看草稿箱中的课程
    Map<String, List<Course>> getDraftBoxCourses(Integer teacherId);


//    List<Map<String, Object>> getStudentProgressForCourse(Integer courseId);
    
    IPage<Course> getCourses(Page<Course> page, String level, String subject, String sort);

    //教师查看课程详情并进行修改
    Course getCourseDetailTeacher(Integer courseId);
//    List<StudentCourseDTO> getCourseStudents(Integer courseId, Integer teacherId);
    void updateCourse(Course course);
    void deleteCourseById(Integer courseId);
    void addCourse(Course course);

    //拉黑评论
    boolean blockComment(Integer commentId);

    int countByTeacherId(Integer teacherId);

    Double getAverageRatingByTeacherId(Integer teacherId);
    int countCommentsByTeacherId(Integer teacherId);

    int countStudentsByTeacherId(Integer teacherId);

    List<Course> getRecentlyUpdatedCoursesByTeacherId(Integer teacherId);
    /**
     * 获取课程详情，包括章节信息
     * @param courseId 课程ID
     * @param studentId 学生ID（可选，用于判断是否已收藏、订阅）
     * @return 课程详情DTO
     */
    CourseDetailDTO getCourseDetail(Integer courseId, Integer studentId);
    
    /**
     * 获取课程基本详情，不包括章节信息，用于提高加载速度
     * @param courseId 课程ID
     * @param studentId 学生ID（可选，用于判断是否已收藏、订阅）
     * @return 课程详情DTO（不含章节信息）
     */
    CourseDetailDTO getCourseBasicDetail(Integer courseId, Integer studentId);

    CourseDTO getCourseInfo(Integer courseId);

    /**
     * 获取课程评论列表
     * @param courseId 课程ID
     * @param page 分页参数
     * @return 评论列表
     */
    IPage<CourseCommentDTO> getCourseComments(Integer courseId, Page<CourseCommentDTO> page);

    /**
     * 添加课程评论
     * @param courseId 课程ID
     * @param studentId 学生ID
     * @param content 评论内容
     * @param rating 评分
     * @param username 用户名
     * @param userAvatar 用户头像
     * @return 是否成功
     */
    boolean addCourseComment(Integer courseId, Integer studentId, String content, Integer rating, String username, String userAvatar);

    /**
     * 返回各类情况的课程熟料
     * @return
     */
    Map<String, Object> getCourseCountByStatus();

    PageResponseDTO<CourseListDTO> getCoursePage(int page, int size);

    // 新增：按订阅数等排序的课程分页
    PageResponseDTO<CourseListDTO> getCourseRankingPage(int page, int size, String orderBy, String orderType);

    /**
     * 审批课程 - 通过
     * @param courseId 课程ID
     * @return 是否成功
     */
    boolean approveCourse(Integer courseId);

    /**
     * 审批课程 - 拒绝
     * @param courseId 课程ID
     * @return 是否成功
     */
    boolean rejectCourse(Integer courseId);

    /**
     * 获取待审批课程分页（notice.vue使用）
     * @param page 页码
     * @param size 每页大小
     * @param status 状态过滤（可选）
     * @return 课程分页数据
     */
    PageResponseDTO<CourseListDTO> getApprovalCoursePage(int page, int size, String status);
    /** 
     * 获取课程评论总数
     * @param courseId 课程ID
     * @return 评论总数
     */
    Long getCourseCommentCount(Integer courseId);
    
    /**
     * 获取课程平均评分
     * @param courseId 课程ID
     * @return 平均评分
     */
    Double getCourseAverageRating(Integer courseId);
}
